package ru.niir.goodfil.ui;

import ru.niir.goodfil.db.*;
import ru.niir.goodfil.db.dic.DeliveryType;
import ru.niir.goodfil.db.handlers.Goodfil;
import ru.niir.goodfil.ui.utils.FilePublisher;

import javax.faces.model.SelectItem;
import java.util.*;
import java.io.*;
import java.text.SimpleDateFormat;

import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * Базовый бин для построения отчетов.
 */
public abstract class BaseReportsBean extends PageBean
{
    protected final Logger logger = Logger.getLogger(this.getClass());
    private final String CLASS_NAME = this.getClass().getName();

    /**
     * Наименование настройки, содержащей путь к каталогу временных файлов
     */
    public static final String TEMP_CATALOG = ".temp";

    /**
     * Расположение временных файлов по умолчанию
     */
    public static final String DEFAULT_TEMP_CATALOG = "C:\\Temp";

    /**
     * Возвращает путь к шаблону отчета
     */
    protected abstract String getTemplatedPath();

    /**
     * Возвращает путь к шаблону отчета по-умолчанию
     */
    protected abstract String getTemplatedPathDefault();

    /**
     * Возвращает наименовнаие отчета
     */
    protected abstract String getReportName();

    /**
     * Генерация отчета (логика, работа с Excel)
     */
    protected abstract void generateReport(Workbook wb);

    /**
     * Генерация отчета (полный цикл)
     */
    public final void generateReport()
    {
        logger.debug("REPORT: " + getReportName() + " provided by class " + CLASS_NAME);

        gf().createIfNotExists(RestsExportBean.TEMP_CATALOG, RestsExportBean.DEFAULT_TEMP_CATALOG, "Каталог временных файлов");
        String tempCatalog = gf().get(RestsExportBean.TEMP_CATALOG);
        logger.debug("Temp catalog is: " + tempCatalog);

        gf().createIfNotExists(getTemplatedPath(), getTemplatedPathDefault(), "Шаблон для отчета \"" + getReportName() + "\"");
        String templatePath = gf().get(getTemplatedPath());
        logger.debug("Template catalog is: " + templatePath);

        String uid = UUID.randomUUID().toString();
        logger.debug("Report uid is: " + uid);

        String tempFile = tempCatalog + File.separator + uid + ".xls";
        logger.debug("Temp file is: " + tempFile);

        Workbook wb = null;
        logger.debug("Opening workbook...");
        try {
            wb = new HSSFWorkbook(new FileInputStream(templatePath));
        } catch (IOException ioe) {
            facesError("Невозможно открыть шаблон отчета");
            return;
        }

        boolean isGenerated = false;
        logger.debug("Report generation started");
        try
        {
            generateReport(wb);
            isGenerated = true;
            logger.debug("Report generation finished");
        }
        catch (Exception e) {
            logger.error("Exception during report generation: " + e);
            e.printStackTrace();
        }

        if (isGenerated) {
            try {
                logger.debug("Writing output file to " + tempFile);
                FileOutputStream fos = new FileOutputStream(tempFile);
                wb.write(fos);
                fos.flush();
                fos.close();
                logger.debug("  done");

                logger.debug("Publishing...");
                String link = FilePublisher.retrieveFile(request(), tempFile, uid + ".xls");
                logger.debug("Published to: " + link);
                response().sendRedirect(link);
            } catch (IOException e) {
                facesError("Ошибка записи отчета");    
            }
        } else {
            facesError("Ошибка при генерации отчета");
        }
    }
}